package com.pe.pgn.clubpgn.webapp.controller.afiliacion;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaCelular;
import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpbEstadoCivil;
import com.pe.pgn.clubpgn.domain.ClpbTarjetaPersona;
import com.pe.pgn.clubpgn.domain.ClpbTipoDocumentoPersona;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.beans.BNAfiliacion;
import com.pe.pgn.clubpgn.domain.beans.BNProgramaDetalle;
import com.pe.pgn.clubpgn.service.AfiliacionService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

import org.apache.commons.lang.StringUtils;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * @author Frank
 * */

@Controller
@RequestMapping("/afiliacion/**")
public class AfiliacionController extends BaseFormController{
	
	@Autowired
	private AfiliacionService afiliacionService;	
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/afiliacionform.html", method = RequestMethod.GET)
	public void initAfiliacion(Model modelMap,
	@RequestParam(value = "coDocument", required = false) String coDocument,
		@RequestParam(value = "codeTipoDoc",required = false) String codeTipoDoc, 
		HttpServletRequest request) {

		String coDepartamento   = "";
		String coProvincia 	    = "";		
		BNAfiliacion afiliacion = new BNAfiliacion();
		List listDep  = null;
		List listProv = null;
		List listDist = null;
		
		boolean esUsuarioDeEmpresaAfiliadora = Boolean.FALSE;
		String deEmpresaAfiliadora = "";
		Map<String, Object> empresa = afiliacionService.obtenerEmpresaAfiliadora();
		if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
			deEmpresaAfiliadora = (String) empresa.get("deEmpresaAfiliadora");
			afiliacion.setDeEmpresaAfiliadora(deEmpresaAfiliadora);
			esUsuarioDeEmpresaAfiliadora = empresa.get("coEmpresaAfiliadora") != null;
		}
		
		if(ValidationUtil.isValidateString(coDocument) &&
		   ValidationUtil.isValidateString(codeTipoDoc)){
			
			afiliacion = afiliacionService.findClientePersonaPorCoDocumento(coDocument,codeTipoDoc);			
			if(afiliacion == null || afiliacion.getId() == null){
				
				afiliacion.setCoTipoDocumentoPersona(codeTipoDoc);
				afiliacion.setCoCodeNumeroDocumento(coDocument);
				afiliacion.setListaprograma(afiliacionService.getListarProgramasxDefecto());
				/////////////////////////////////
				listDep = afiliacionService.findDepartamentosUbigeo(false);				
				for (int i = 0; i < listDep.size(); i++) {					
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
					if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
						coDepartamento = dep.getCoDepartamento().toString();
						break;
					}
				}
				
				if("".equals(coDepartamento)){
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
					coDepartamento = dep.getCoDepartamento().toString();
				}
				
				/////////////////////////////////
				listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
				for (int i = 0; i < listProv.size(); i++) {					
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
					if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
						coProvincia = prov.getCoProvincia().toString();
						break;
					}
				}
				
				if("".equals(coProvincia)){
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
					coProvincia = prov.getCoProvincia().toString();
				}

				/////////////////////////////////
				afiliacion.setCoDepartamento(coDepartamento);
				afiliacion.setCoProvincia(coProvincia);
				listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);
			
			////////////////////////////////////////////////////////////////////
			////////////////////////////////////////////////////////////////////
			////////////////////////////////////////////////////////////////////
				
			}else if(ValidationUtil.isValidateString(afiliacion.getCoDepartamento())){
				
				if(esUsuarioDeEmpresaAfiliadora){
					
					BigDecimal coEmpresaAfiliadoraUsuario = (BigDecimal) empresa.get("coEmpresaAfiliadora");
					//si el cliente fue registrado por empresa afiliadora y es la misma que lo registro
					if(afiliacion.getCoEmpresaAfiliadora() != null
								&& coEmpresaAfiliadoraUsuario.equals(afiliacion.getCoEmpresaAfiliadora())){ 
							
				listDep  = afiliacionService.findDepartamentosUbigeo(false);				
				listProv = afiliacionService.findPronvinciaUbigeo(afiliacion.getCoDepartamento().toString(), false);				
				listDist = afiliacionService.findDistritoUbigeo(afiliacion.getCoDepartamento().toString(),afiliacion.getCoProvincia().toString(), false);
							
					} else{
						
						saveError(request, getText("afiliacionform.mensajeafiliadoconotrapromocion", request.getLocale()));
						afiliacion = new BNAfiliacion();
						afiliacion.setCoTipoDocumentoPersona(CLPConstantes.ESPACIO_VACIO);
						afiliacion.setCoCodeNumeroDocumento(CLPConstantes.ESPACIO_VACIO);
						afiliacion.setListaprograma(afiliacionService.getListarProgramas());
						/////////////////////////////////
						listDep = afiliacionService.findDepartamentosUbigeo(false);				
						for (int i = 0; i < listDep.size(); i++) {					
							ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
							if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
								coDepartamento = dep.getCoDepartamento().toString();
								break;
							}
						}
						
						if("".equals(coDepartamento)){
							ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
							coDepartamento = dep.getCoDepartamento().toString();
						}
						
						/////////////////////////////////
						listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
						for (int i = 0; i < listProv.size(); i++) {					
							ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
							if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
								coProvincia = prov.getCoProvincia().toString();
								break;
							}
						}
						
						if("".equals(coProvincia)){
							ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
							coProvincia = prov.getCoProvincia().toString();
						}

						/////////////////////////////////
						afiliacion.setCoDepartamento(coDepartamento);
						afiliacion.setCoProvincia(coProvincia);
						listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);		
					}
					afiliacion.setDeEmpresaAfiliadora(deEmpresaAfiliadora);
				} else {
					
					listDep  = afiliacionService.findDepartamentosUbigeo(false);				
					listProv = afiliacionService.findPronvinciaUbigeo(afiliacion.getCoDepartamento().toString(), false);				
					listDist = afiliacionService.findDistritoUbigeo(afiliacion.getCoDepartamento().toString(),afiliacion.getCoProvincia().toString(), false);
				}
				
			}else{
				
				listDep = afiliacionService.findDepartamentosUbigeo(false);		
				for (int i = 0; i < listDep.size(); i++) {					
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
					if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
						coDepartamento = dep.getCoDepartamento().toString();
						break;
					}
				}
				
				if("".equals(coDepartamento)){
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
					coDepartamento = dep.getCoDepartamento().toString();
				}
				
				listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
				for (int i = 0; i < listProv.size(); i++) {					
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
					if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
						coProvincia = prov.getCoProvincia().toString();
						break;
					}
				}
				
				if("".equals(coProvincia)){
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
					coProvincia = prov.getCoProvincia().toString();
				}
				
				afiliacion.setCoDepartamento(coDepartamento);
				afiliacion.setCoProvincia(coProvincia);
				listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);
			}		
		}else{

			afiliacion = new BNAfiliacion();
			afiliacion.setListaprograma(afiliacionService.getListarProgramasxDefecto());
			listDep = afiliacionService.findDepartamentosUbigeo(false);		
			for (int i = 0; i < listDep.size(); i++) {					
				ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
				if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
					coDepartamento = dep.getCoDepartamento().toString();
					break;
				}
			}
			
			if("".equals(coDepartamento)){
				ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
				coDepartamento = dep.getCoDepartamento().toString();
			}
			
			listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
			for (int i = 0; i < listProv.size(); i++) {					
				ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
				if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
					coProvincia = prov.getCoProvincia().toString();
					break;
				}
			}
			
			if("".equals(coProvincia)){
				ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
				coProvincia = prov.getCoProvincia().toString();
			}
			
			afiliacion.setCoDepartamento(coDepartamento);
			afiliacion.setCoProvincia(coProvincia);
			listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);
		}	
		
		if(esUsuarioDeEmpresaAfiliadora){
			afiliacion.setDeEmpresaAfiliadora(deEmpresaAfiliadora);
			afiliacion.setEsUsuarioEmpresaAfiliadora(CLPConstantes.UNO);
		} else {
			afiliacion.setEsUsuarioEmpresaAfiliadora(CLPConstantes.ZERO);
		}
		
		modelMap.addAttribute("afiliacion" 				  , afiliacion);
        modelMap.addAttribute("listaempresacelulares"	  , afiliacionService.findEmpresasCelulares(true));
        modelMap.addAttribute("listaestadocivil"		  , afiliacionService.findEstadosCiviles());
        modelMap.addAttribute("listatipodocumentopersona" , afiliacionService.findTiposDocumentoPersona());
        modelMap.addAttribute("listadepartamento"		  , listDep);
        modelMap.addAttribute("listaprovincia"			  , listProv);
        modelMap.addAttribute("listadistrito"			  , listDist);
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/afiliacionform.html", method = RequestMethod.POST)
	public String guardarAfiliacion(@ModelAttribute("afiliacion") BNAfiliacion afiliacion,
		   BindingResult result, SessionStatus status, HttpServletRequest request,Model modelMap) {
		
		try {
		
			String msg = "";
			String indicatorTarjeta  = "";
	        String operation 		 = "";
	        String coTarjetaAsig     = "";
	        String deTarjetaAsig	 = "";
	        boolean isValidateStatus = true;
	        boolean isOlder 		 = false;
	        boolean cambioTarjeta 	 = false;
	        Calendar fecNacimiento	 = null;
			
	        List listDep  = null;
			List listProv = null;
			List listDist = null;
			
			BNAfiliacion beanafiliacionInicial = afiliacion;
	        if(ValidationUtil.isValidateString(afiliacion.getCoDepartamento())){
				
				listDep  = afiliacionService.findDepartamentosUbigeo(false);				
				listProv = afiliacionService.findPronvinciaUbigeo(afiliacion.getCoDepartamento(),false);				
				listDist = afiliacionService.findDistritoUbigeo(afiliacion.getCoDepartamento(),afiliacion.getCoProvincia(),false);
			}else{
				
				String coDepartamento = "";
				String coProvincia	  = "";
				
				///////////////////////////////////////////////////////////
				listDep = afiliacionService.findDepartamentosUbigeo(false);		
				for (int i = 0; i < listDep.size(); i++) {					
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
					if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
						coDepartamento = dep.getCoDepartamento().toString();
						break;
					}
				}
				
				if("".equals(coDepartamento)){
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
					coDepartamento = dep.getCoDepartamento().toString();
				}
				
				/////////////////////////////////////////////////////////////////////////
				listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
				for (int i = 0; i < listProv.size(); i++) {					
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
					if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
						coProvincia = prov.getCoProvincia().toString();
						break;
					}
				}
				
				if("".equals(coProvincia)){
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
					coProvincia = prov.getCoProvincia().toString();
				}
				
				listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);
			}
	        
	        
	        modelMap.addAttribute("afiliacion" 				  , beanafiliacionInicial);
	        modelMap.addAttribute("listaempresacelulares"	  , afiliacionService.findEmpresasCelulares(true));
	        modelMap.addAttribute("listaestadocivil"		  , afiliacionService.findEstadosCiviles());
	        modelMap.addAttribute("listatipodocumentopersona" , afiliacionService.findTiposDocumentoPersona());
	        modelMap.addAttribute("listadepartamento"		  , listDep);
	        modelMap.addAttribute("listaprovincia"			  , listProv);
	        modelMap.addAttribute("listadistrito"			  , listDist);
	        
	        /////////////////////////////////////////////////////////////////
	        
			boolean esUsuarioDeEmpresaAfiliadora = Boolean.FALSE;
			String deEmpresaAfiliadora = "";
			Map<String, Object> empresa = afiliacionService.obtenerEmpresaAfiliadora();
			if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
				deEmpresaAfiliadora = (String) empresa.get("deEmpresaAfiliadora");
				afiliacion.setDeEmpresaAfiliadora(deEmpresaAfiliadora);
				esUsuarioDeEmpresaAfiliadora = empresa.get("coEmpresaAfiliadora") != null;
			}
			
	        if(esUsuarioDeEmpresaAfiliadora){
	        	int indicadorCliente = afiliacionService.verificarSiYaEsClientePorDocumento(afiliacion.getCoCodeNumeroDocumento());
	        	if(indicadorCliente == CLPConstantes.INDICADOR_CLIENTE_NO_ES_DE_EMPRESA_AFILIADORA){
	        		saveError(request, getText("afiliacionform.mensajeafiliadoconotrapromocion", request.getLocale()));
					afiliacion.setDeEmpresaAfiliadora(deEmpresaAfiliadora);
					return "/afiliacion/afiliacionform";
	        	}
	        }
	        
	        String coDepartamento = afiliacion.getCoDepartamento();
	        String coProvincia 	  = afiliacion.getCoProvincia();
	        String coDistrito 	  = afiliacion.getCoDistrito();	        
	        
	        if(!ValidationUtil.isValidateString(coDepartamento)){
	        	return "/afiliacion/afiliacionform";
	        }
	        
	        if("-1".equalsIgnoreCase(afiliacion.getJrDireccion())){
	        	afiliacion.setJrDireccion("");
	        }
	        
        	ClpmUbigeo clpmUbigeo = afiliacionService.getUbigeo(coDepartamento,coProvincia,coDistrito);
        	afiliacion.setClpmUbigeo(clpmUbigeo);
	        
	        String tipodoc 	   	   = afiliacion.getCoTipoDocumentoPersona();
	        String estadocivil 	   = afiliacion.getCoEstadoCivil();
	        String empresacelular  = afiliacion.getCoEmpresaCelular();
	        String codProvCelular  = afiliacion.getCodProvCelular();
	        String coCelular 	   = afiliacion.getCoCelular();
	        String codProvTelefono = afiliacion.getCodProvTelefono();
	        String coTelefonoFijo  = afiliacion.getCoTelefonoFijo();
	        
	        if(tipodoc != null){
	        	ClpbTipoDocumentoPersona clpbTipoDocumentoPersona = new ClpbTipoDocumentoPersona();
	        	clpbTipoDocumentoPersona.setId(new Long(tipodoc));
	        	afiliacion.setClpbTipoDocumentoPersona(clpbTipoDocumentoPersona);
	        }
	        
	        if("-1".equals(empresacelular)){
	        	empresacelular = null;
	        	afiliacion.setCoEmpresaCelular(null);
	        }
	        
	        if(estadocivil != null){
	        	ClpbEstadoCivil clpbEstadoCivil = new ClpbEstadoCivil();
	        	clpbEstadoCivil.setId(new Long(estadocivil));
	        	afiliacion.setClpbEstadoCivil(clpbEstadoCivil);
	        }
	        
	        if(empresacelular != null){
	        	ClpbEmpresaCelular clpbEmpresaCelular = new ClpbEmpresaCelular();
	        	clpbEmpresaCelular.setId(new Long(empresacelular));
	        	afiliacion.setClpbEmpresaCelular(clpbEmpresaCelular);
	        }
	        
	        /////////////////////////////////////////////////////////////////
	        
	        if(ValidationUtil.isValidateString(empresacelular) || 
	           ValidationUtil.isValidateString(codProvCelular) || 
	           ValidationUtil.isValidateString(coCelular)){
	        	
	           	if(!ValidationUtil.isValidateString(empresacelular)){
	           		saveError(request, getText("afiliacionform.mensajeempresacelular", request.getLocale()));
					return "/afiliacion/afiliacionform";
	           	}else if(!ValidationUtil.isValidateString(codProvCelular)){
	           		saveError(request, getText("afiliacionform.mensajecodprovcelular", request.getLocale()));
					return "/afiliacion/afiliacionform";
	           	}else if(!ValidationUtil.isValidateString(coCelular)){
	           		saveError(request, getText("afiliacionform.mensajecocelular", request.getLocale()));
					return "/afiliacion/afiliacionform";
	           	}
	        }
	        
	        if(ValidationUtil.isValidateString(codProvTelefono) || 
	           ValidationUtil.isValidateString(coTelefonoFijo)){
	        	
	        	if(!ValidationUtil.isValidateString(codProvTelefono)){
	        		saveError(request, getText("afiliacionform.mensajecodprovtelefono", request.getLocale()));
					return "/afiliacion/afiliacionform";
	           	}else if(!ValidationUtil.isValidateString(coTelefonoFijo)){
	           		saveError(request, getText("afiliacionform.mensajecotelefono", request.getLocale()));
					return "/afiliacion/afiliacionform";
	           	}
	        }
	        
	        /////////////////////////////////////////////////////////////////
			
	        ClpbEstacion estacion = afiliacionService.getUsuarioLogueado().getClpbEstacion();
	        if(estacion == null || estacion.getId() == null){	        	
	        	saveError(request, getText("afiliacionform.usuarionoestacion", request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        msg = validaLongitudDocumento(afiliacion);
	        if(!"".equals(msg)){
	        	saveError(request, getText("afiliacionform.longnumberdocument",msg, request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        
	        try{
	        	fecNacimiento = CalendarUtil.stringToCalendar
	        	(CLPConstantes.DATE_PATTERN, afiliacion.getDesFechaNacimiento());
	        	afiliacion.setDaFechaNacimiento(fecNacimiento);
	        }catch(Exception e){
	        	saveError(request, getText("afiliacionform.novalidafechanacimiento", request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }	        
	        
	        isOlder = ValidationUtil.isOlder(afiliacion.getDaFechaNacimiento());
	        if(!isOlder){
	        	saveError(request, getText("afiliacionform.noisolder", request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        if(afiliacion.getId() != null){
	        	Map mapCoTarjeta = (HashMap)afiliacionService.getCoTarjetaPersonaByIDClientePersona(afiliacion.getId());
        		coTarjetaAsig 	 = String.valueOf(mapCoTarjeta.get("co_tarjeta"));
        		deTarjetaAsig 	 = String.valueOf(mapCoTarjeta.get("de_tarjeta"));
        		
        		if(coTarjetaAsig.equals("null")){ //tenia asignada una tarjeta inactiva
    	        	Map map = validarSiTarjetaInactivaFueAnulada(afiliacion);
    	        	coTarjetaAsig = map.get("cotarjeta").toString();
    	        	deTarjetaAsig = map.get("detarjeta").toString();
    	        }
	        }       
	        
	        Map objMap = validaSiConservaTarjetaInactiva(afiliacion);
	        isValidateStatus = Boolean.parseBoolean(objMap.get("status").toString());
	        
	        if(!isValidateStatus){
	        	coTarjetaAsig = objMap.get("cotarjeta").toString();
	        	deTarjetaAsig = objMap.get("detarjeta").toString();
	        }
	        
	        msg = validataNumeroTarjetaPersona(afiliacion,isValidateStatus,estacion,deTarjetaAsig);
	        if(!"".equals(msg)){
	        	
	        	saveError(request, getText("afiliacionform.tarjeta.invalida", request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        msg = validaNumeroDocumento(afiliacion);
	        if(!"".equals(msg)){
	        	
	        	saveError(request, getText("afiliacionform.existnumberdocument",afiliacion.getCoCodeNumeroDocumento(), request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        ////////////////////////////////////////////////
	        //Si esta en modo insertar debe de tener una tarjeta asignada
	        if(afiliacion.getId() == null && 
	        afiliacion.getClpbTarjetaPersona().getId() == null){
	        	
	        	saveError(request, getText("afiliacionform.notarjetaasignada", request.getLocale()));
				return "/afiliacion/afiliacionform";
	        }
	        
	        ////////////////////////////////////////////////
	        
	        //VALIDACION PROGRAMAS COMPATIBLES
	        boolean hasProgram = false;
	        List<BNProgramaDetalle> lista = afiliacion.getListaprograma();
	    	if(lista != null && lista.size() > 0){
	    		
	    		if(esUsuarioDeEmpresaAfiliadora){
	    			BNProgramaDetalle programaDetalle = new BNProgramaDetalle();
	    			BigDecimal coPrograma = (BigDecimal) empresa.get("coPrograma");
	    			
	    			programaDetalle.setChkNoCompatible(Boolean.TRUE);
	    			programaDetalle.setId(new Long(coPrograma.toString()));
	    			programaDetalle.setStNoCompatible(CLPConstantes.ST_VERDADERO);
	    			lista.clear();
	    			lista.add(programaDetalle);
	    		}
	    		
	    		for (BNProgramaDetalle bnDetalle : lista) {
					if(bnDetalle.isChkNoCompatible()){
						
						hasProgram = true;
						String coPrograma = ""+bnDetalle.getId();
						String message = afiliacionService.isValidCoPrograma(coPrograma,lista);
						if(message != ""){
							
							saveError(request, getText("afiliacionform.nocompatibleprograma",message, request.getLocale()));
							return "/afiliacion/afiliacionform";
						}					
					}
	    		}
	    	}
	    	
	    	////////////////////////////////////////////////
	    	//Debe de tener al menos un programa afiliado
	    	if(!hasProgram){
	    		
	    		saveError(request, getText("afiliacionform.seleccioneprograma", request.getLocale()));
				return "/afiliacion/afiliacionform";
	    	}
	    	
	    	////////////////////////////////////////////////    	
	        // MODO INSERTAR
	        if(afiliacion.getId() == null){
	        	
	            if(afiliacion.getClpbTarjetaPersona().getId() != null){ //le voy asignar por primera vez una tarjeta
	            	
	            	afiliacion.setStHabilitado(true);
	            	indicatorTarjeta = CLPConstantes.INDICADOR_TARJETA_1;
	            }else{
	            	afiliacion.setStHabilitado(false);
	            }
	            
	            afiliacion.setStClientePersona(true);
	        	operation = CLPConstantes.FLAG_INSERT;
	        	
	        // MODO ACTUALIZAR
	        }else{
	        	
	        	if(!"".equals(coTarjetaAsig) && !"null".equals(coTarjetaAsig)){ //tenia tarjeta
	        		
	        		String deTarjetaModif = String.valueOf(afiliacion.getCoTarjetaPersona_text()).trim();
	        		if("".equals(deTarjetaModif) || "null".equals(deTarjetaModif)){ // tenia tarjeta y lo borro
	        			
	        			afiliacion.setStHabilitado(false);
	        			indicatorTarjeta = CLPConstantes.INDICADOR_TARJETA_2;
	        			
	        		}else{ //todavia tiene tarjeta
	        			
	        			if(!afiliacion.isStHabilitado()){ //deshabilito su tarjeta
	        				
	        				ClpbTarjetaPersona tp = new ClpbTarjetaPersona();
	                		tp.setId(new Long(coTarjetaAsig));
	                		tp.setCoCodigoTarjetaPersona(deTarjetaAsig);
	                		afiliacion.setClpbTarjetaPersona(tp); //conserva su tarjeta pero deshabilitada
	                		afiliacionService.updateInactivoTarjetaPersona(coTarjetaAsig,false);
	                		
	        			}else{
	        			
		        			if(deTarjetaAsig.equals(deTarjetaModif)){ //sigue mantenimiendo su misma tarjeta
		        				
		        				afiliacion.setStHabilitado(true);
		        				afiliacionService.updateActivoTarjetaPersona(coTarjetaAsig);
		        				
		        			}else{ // tenia tarjeta y se cambio a otro
		        				
		        				cambioTarjeta = true;
		        				afiliacion.setStHabilitado(true);
		        				afiliacionService.updateInactivoTarjetaPersona(coTarjetaAsig,true); //codigo de la tarjeta a anular
		        				indicatorTarjeta = CLPConstantes.INDICADOR_TARJETA_1;
		        			}
	        			}
	        		}
	        		
	        	}else{ //no tenia tarjeta
	        		
	        		if(afiliacion.getClpbTarjetaPersona().getId() != null){ //le voy asignar por primera vez una tarjeta
	                	
	                	afiliacion.setStHabilitado(true);
	                	indicatorTarjeta = CLPConstantes.INDICADOR_TARJETA_1;
	                }else{
	                	afiliacion.setStHabilitado(false);
	                }
	        	}
	        	
	        	operation = CLPConstantes.FLAG_UPDATE;
	        	int countcards = afiliacionService.getNumCardsByUser(afiliacion.getId());
	        	
	        	if(countcards == 0){
	        		afiliacion.setDaFechaInscripcion(Calendar.getInstance());
	        	}else{
	        		afiliacion.setDaFechaInscripcion(CalendarUtil.stringToCalendar
	    			(CLPConstantes.FORMATO_FECHA_CLUB_PGN,afiliacion.getDesFechaInscripcion()));
	        	}
	        }
			
	        ////////////////////////////////////////////////
	        
	        ClpbClientePersona bean = afiliacionService.setValuesOfBNAfiliacion(afiliacion);
	        afiliacionService.saveOrUpdateClientePersona(bean);
	        initAfiliacion(modelMap,null,null,request); //devuelvo el formulario en modo insertar
	        
	        ////////////////////////////////////////////////
	        
	        if(indicatorTarjeta.equalsIgnoreCase(CLPConstantes.INDICADOR_TARJETA_1)){
	        	afiliacionService.insertFirstTarjetaPersona(bean);
	        }else if(indicatorTarjeta.equalsIgnoreCase(CLPConstantes.INDICADOR_TARJETA_2)){
	        	afiliacionService.updateInactivoTarjetaPersona(coTarjetaAsig,true);
	        }
	        
	        ////////////////////////////////////////////////
	        /**
	         * PROGRAMAS
	         * */
	        
	        if(CLPConstantes.FLAG_INSERT.equals(operation) && 
	           bean.getClpbTarjetaPersona().getId() != null){
	        	
	        	List<BNProgramaDetalle> listProgram = afiliacion.getListaprograma();
	        	if(listProgram != null && listProgram.size() > 0){
	        		for (BNProgramaDetalle bnDetalle : listProgram) {
	    				if(bnDetalle.isChkNoCompatible()){
	    					
	    					String coPrograma = ""+bnDetalle.getId();
	    					afiliacionService.insertClientePrograma(bean,coPrograma);
	    				}
	    			}
	        	}
	        	
	        }else if(CLPConstantes.FLAG_UPDATE.equals(operation) &&        		
	        		bean.getClpbTarjetaPersona() != null && 
	        		bean.getClpbTarjetaPersona().getId() != null && 
	        		bean.isStHabilitado()){
	        	

	        	List<BNProgramaDetalle> listProgram = afiliacion.getListaprograma();
	        	if(listProgram != null && listProgram.size() > 0){
	        		
	        		for (BNProgramaDetalle bnDetalle : listProgram) {	    					
    					afiliacionService.updateClientePrograma(bean,bnDetalle);
	    			}
	        	}        	
	        }
	        ////////////////////////////////////////////////
	        
	        if (!ValidationUtil.isValidateString(""+bean.getId())){
	        	saveError(request, getText("afiliacionform.error", request.getLocale()));
				return "/afiliacion/afiliacionform";
	    	}
	        
	        ////////////////////////////////////////////////
	        
	        if(CLPConstantes.FLAG_INSERT.equals(operation)){
	        	saveMessage(request, getText("afiliacionform.added",
	        	afiliacion.getCoCodeNumeroDocumento(), request.getLocale()));
	        }else if(CLPConstantes.FLAG_UPDATE.equals(operation)){
	        	
	        	if(cambioTarjeta){
	        		saveMessage(request, getText("afiliacionform.updated.confirm.change.card",
	        		afiliacion.getCoCodeNumeroDocumento(), request.getLocale()));
	        	}else{
	        		saveMessage(request, getText("afiliacionform.updated",
	        		afiliacion.getCoCodeNumeroDocumento(), request.getLocale()));
	        	}        	
	        }
	        
	        return "/afiliacion/afiliacionform";
		
		} catch (Exception e) {
			
			e.printStackTrace();
			saveError(request, getText("errors.general", request.getLocale()));
			return "/afiliacion/afiliacionform";
		}
	}
	
	private String validaLongitudDocumento(BNAfiliacion afiliacion) {

		String coNumeroDoc = afiliacion.getCoCodeNumeroDocumento();
		if(StringUtils.isNotBlank(coNumeroDoc)){
			
			int numLenght	 = coNumeroDoc.length();
			Long idTipoDoc   = afiliacion.getClpbTipoDocumentoPersona().getId();
			int vaNumCaract  = Integer.parseInt(""+afiliacionService.getNumeroCaracteresByIdTipoDoc(idTipoDoc));
			
			if(numLenght != vaNumCaract){
				return String.valueOf(vaNumCaract);
			}
		}
		
		return "";
	}
	
	@SuppressWarnings("unchecked")
	private Map validarSiTarjetaInactivaFueAnulada(BNAfiliacion afiliacion) {

		Map map = new HashMap();		
        if(afiliacion.getId() != null){ // MODO ACTUALIZAR
        	
        	// Obteniendo ultima tarjeta inactiva
        	Map mapCoTarjeta 	= (HashMap)afiliacionService.getCoTarjetaPersonaInactivaByIDClientePersona(afiliacion.getId());
        	String coCardAsig 	= String.valueOf(mapCoTarjeta.get("co_tarjeta"));
        	String deCardAsig 	= String.valueOf(mapCoTarjeta.get("de_tarjeta"));
        	String fechaAnulada = String.valueOf(mapCoTarjeta.get("da_fecha_anulacion"));
        	
        	if((!"".equals(coCardAsig) &&
        	   !"null".equals(coCardAsig)) &&
        	    ("null".equals(fechaAnulada) || 
        	     "".equals(fechaAnulada))){ //tenia tarjeta inactiva sin anular
        		
        		map.put("cotarjeta", coCardAsig);
    			map.put("detarjeta", deCardAsig);
        		return map;
        	}
        }
        
        map.put("cotarjeta", "null");
		map.put("detarjeta", "null");
		return map;
	}
	
	@SuppressWarnings("unchecked")
	private Map validaSiConservaTarjetaInactiva(BNAfiliacion afiliacion) {		
				
		Map map = new HashMap();
		
        if(afiliacion.getId() != null){ // MODO ACTUALIZAR
        	
        	// Obteniendo ultima tarjeta inactiva
        	Map mapCoTarjeta 	= (HashMap)afiliacionService.getCoTarjetaPersonaInactivaByIDClientePersona(afiliacion.getId());
        	String coCardAsig 	= String.valueOf(mapCoTarjeta.get("co_tarjeta"));
        	String deCardAsig 	= String.valueOf(mapCoTarjeta.get("de_tarjeta"));
        	
        	if(!"".equals(coCardAsig) && !"null".equals(coCardAsig)){ //tenia tarjeta inactiva
        		
        		String deTarjetaModif = String.valueOf(afiliacion.getCoTarjetaPersona_text()).trim();
        		if(deCardAsig.equals(deTarjetaModif) && afiliacion.isStHabilitado()){ //sigue mantenimiendo su misma tarjeta
        			
        			map.put("cotarjeta", coCardAsig);
        			map.put("detarjeta", deCardAsig);
        			map.put("status"   , false);
        			return map;
        		}
        	}
        }		
        
        map.put("status" , true);
		return map;
	}
	
    private String validataNumeroTarjetaPersona(BNAfiliacion afiliacion, boolean isValidateStatus, ClpbEstacion estacion, String deTarjetaAsig) {

    	String codigoTarjeta = String.valueOf(afiliacion.getCoTarjetaPersona_text()).trim();        
        if(StringUtils.isBlank(codigoTarjeta) || "null".equalsIgnoreCase(codigoTarjeta)){        	
        	codigoTarjeta = null;
        	afiliacion.setClpbTarjetaPersona(new ClpbTarjetaPersona());
        }
        
        if(codigoTarjeta != null){
        	
        	Long coEstacion = estacion.getId();
        	String message  = afiliacionService.isValidCodTarjetaPersona(codigoTarjeta,coEstacion,
        	afiliacion.getId(),isValidateStatus, deTarjetaAsig);
        	
        	try{
        		
        		ClpbTarjetaPersona tp = new ClpbTarjetaPersona();
        		tp.setId(new Long(message));
        		afiliacion.setClpbTarjetaPersona(tp);
        		return "";
        		
        	}catch(Exception e){
        		
        		return message;
        	}
        }        
		return "";		
	}
    
	private String validaNumeroDocumento(BNAfiliacion afiliacion) {
		
		boolean isValid = afiliacionService.isValidCodNumeroDocClientePersona(
    	afiliacion.getCoCodeNumeroDocumento(),afiliacion.getId());
    	
    	if(!isValid){			
    		return "msg";
    	}
		
		return "";
	}
}
